package com.GPT.common;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class Jwt {

    // 密钥用于签名 JWT，确保安全性。自己的密钥。
    private static final String SECRET_KEY = "your-secret-key";
    // JWT 的过期时间，为1小时（3600秒）
    private static final long EXPIRATION_TIME = 3600_000;

    /**
     * 生成 JWT token
     * @param userId 用户ID，作为 token 的主体
     * @return 生成的 JWT token 字符串
     */
    public static String generateToken(Long userId) {
        return Jwts.builder()
                .setSubject(userId.toString()) // 设置 token 的主体为用户ID
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置 token 的过期时间
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY) // 使用 HS512 算法和密钥进行签名
                .compact(); // 构建 token 字符串
    }

    /**
     * 从 JWT token 中提取 Claims 信息
     * @param token JWT token 字符串
     * @return Claims 对象，包含 token 中的声明信息
     */
    public static Claims getClaims(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY) // 设置解析 token 时使用的密钥
                .parseClaimsJws(token) // 解析 token
                .getBody(); // 获取 token 的主体部分，即 Claims 对象
    }

    /**
     * 从 JWT token 中获取用户ID
     * @param token JWT token 字符串
     * @return 从 token 中解析出来的用户ID
     */
    public static Long getUserId(String token) {
        return Long.parseLong(getClaims(token).getSubject()); // 从 Claims 中获取用户ID
    }

    /**
     * 检查 JWT token 是否过期
     * @param token JWT token 字符串
     * @return 如果 token 已过期则返回 true，否则返回 false
     */
    public static boolean isTokenExpired(String token) {
        return getClaims(token).getExpiration().before(new Date()); // 比较 token 的过期时间和当前时间
    }

    /**
     * 验证 JWT token 是否有效
     * @param token JWT token 字符串
     * @return 如果 token 还未过期则返回 true，否则返回 false
     */
    public static boolean validateToken(String token) {
        return !isTokenExpired(token); // 验证 token 是否过期
    }
}
